/*
 * This file is part of Ext JS 3.4 Copyright (c) 2011-2013 Sencha Inc Contact: http://www.sencha.com/contact GNU General Public License Usage This file may be
 * used under the terms of the GNU General Public License version 3.0 as published by the Free Software Foundation and appearing in the file LICENSE included in
 * the packaging of this file. Please review the following information to ensure the GNU General Public License version 3.0 requirements will be met:
 * http://www.gnu.org/copyleft/gpl.html. If you are unsure which license is appropriate for your use, please contact the sales department at
 * http://www.sencha.com/contact. Build date: 2013-04-03 15:07:25
 */

/**
 * @class Ext.state.CookieProvider
 * @extends Ext.state.Provider The default Provider implementation which saves state via cookies. <br />Usage:
 * 
 * <pre><code>
 * var cp = new Ext.state.CookieProvider(
 * {
 * 	path: &quot;/cgi-bin/&quot;,
 * 	expires: new Date(new Date().getTime() + (1000 * 60 * 60 * 24 * 30)), //30 days
 * 	domain: &quot;extjs.com&quot;
 * });
 * Ext.state.Manager.setProvider(cp);
 * </code></pre>
 * 
 * @cfg {String} path The path for which the cookie is active (defaults to root '/' which makes it active for all pages in the site)
 * @cfg {Date} expires The cookie expiration date (defaults to 7 days from now)
 * @cfg {String} domain The domain to save the cookie for. Note that you cannot specify a different domain than your page is on, but you can specify a
 *      sub-domain, or simply the domain itself like 'extjs.com' to include all sub-domains if you need to access cookies across different sub-domains (defaults
 *      to null which uses the same domain the page is running on including the 'www' like 'www.extjs.com')
 * @cfg {Boolean} secure True if the site is using SSL (defaults to false)
 * @constructor Create a new CookieProvider
 * @param {Object} config The configuration object
 */
Ext.state.CookieProvider = Ext.extend(Ext.state.Provider,
{

	constructor: function( config )
	{
		Ext.state.CookieProvider.superclass.constructor.call(this);
		this.path = "/";
		this.expires = new Date(new Date().getTime() + (1000 * 60 * 60 * 24 * 7)); // 7 days
		this.domain = null;
		this.secure = false;
		Ext.apply(this, config);
		this.state = this.readCookies();
	},

	// private
	set: function( name, value )
	{
		if( typeof value == "undefined" || value === null )
		{
			this.clear(name);
			return;
		}
		this.setCookie(name, value);
		Ext.state.CookieProvider.superclass.set.call(this, name, value);
	},

	// private
	clear: function( name )
	{
		this.clearCookie(name);
		Ext.state.CookieProvider.superclass.clear.call(this, name);
	},

	// private
	readCookies: function()
	{
		var cookies = {}, c = document.cookie + ";", re = /\s?(.*?)=(.*?);/g, matches, name, value;
		while((matches = re.exec(c)) != null)
		{
			name = matches[1];
			value = matches[2];
			if( name && name.substring(0, 3) == "ys-" )
			{
				cookies[name.substr(3)] = this.decodeValue(value);
			}
		}
		return cookies;
	},

	// private
	setCookie: function( name, value )
	{
		document.cookie =
		"ys-" + name + "=" + this.encodeValue(value) + ((this.expires == null) ? "" : ("; expires=" + this.expires.toGMTString())) + ((this.path == null) ? "" : ("; path=" + this.path))
		+ ((this.domain == null) ? "" : ("; domain=" + this.domain)) + ((this.secure == true) ? "; secure" : "");
	},

	// private
	clearCookie: function( name )
	{
		document.cookie =
		"ys-" + name + "=null; expires=Thu, 01-Jan-70 00:00:01 GMT" + ((this.path == null) ? "" : ("; path=" + this.path)) + ((this.domain == null) ? "" : ("; domain=" + this.domain)) + ((this.secure == true) ? "; secure" : "");
	}
});